package com.wuage.infrastructure.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

/**
 * @author Shynin
 * @version 1.0
 * @date 2020-09-09 11:00
 */
public class LocalDateUtils {



    /**
     * 日期时间转字符串格式
     */
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 日期转字符串格式
     */
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取当前月份字符串("yyyy-MM")
     * @return 当前月份("yyyy-MM")
     */
    public static String getMonthSringByNow(){
        LocalDate localDate = LocalDate.now();
        return localDate.format(DATE_FORMATTER).substring(0, 7);
    }

    /**
     * 获取当前天的字符串("yyyy-MM-dd")
     * @return 当前天数("yyyy-MM-dd")
     */
    public static String getDayStringByNow() {
        return LocalDate.now().format(DATE_FORMATTER);
    }

    /**
     * 日期String("yyyy-MM-dd")转为LocalDate
     * @param date 日期("yyyy-MM-dd")
     * @return LocalDate
     */
    public static LocalDate getLocalDate(String date) {
        return LocalDate.parse(date, DATE_FORMATTER);
    }

    /**
     * 日期时间String("yyyy-MM-dd HH:mm:ss")转为LocalDateTime
     * @param datetime 日期时间("yyyy-MM-dd HH:mm:ss")
     * @return LocalDateTime
     */
    public static LocalDateTime getLocalDateTime(String datetime) {
        return LocalDateTime.parse(datetime, DATE_TIME_FORMATTER);
    }

    /**
     * 根据月份String("yyyy-MM")获取当月1日的LocalDate
     * @param month 月份("yyyy-MM")
     * @return 当月1日的日期
     */
    public static LocalDate getFirstDayOfMonth(String month) {
        month += "-01";
        return LocalDate.parse(month, DATE_FORMATTER);
    }

    /**
     * 根据月份String("yyyy-MM")获取当月最后一日的LocalDate
     * @param month 月份("yyyy-MM")
     * @return 当月最后一日的日期
     */
    public static LocalDate getLastDayOfMonth(String month) {
        return getFirstDayOfMonth(month).with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 根据LocalDate获取当月1日0时的LocalDateTime
     * @param localDate 日期
     * @return 该日期所在月的1日0时的LocalDateTime
     */
    public static LocalDateTime getStartTimeOfMonth(LocalDate localDate){
        return localDate.with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();
    }

    /**
     * 根据LocalDateTime获取当月1日0时的LocalDateTime
     * @param localDateTime 日期时间
     * @return 该日期时间所在月的1日0时的LocalDateTime
     */
    public static LocalDateTime getStartTimeOfMonth(LocalDateTime localDateTime){
        return localDateTime.toLocalDate().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();
    }

    /**
     * 根据月份String("yyyy-MM")获取当月1日0时的LocalDateTime
     * @param month 月份("yyyy-MM")
     * @return 该月1日0时的LocalDateTime
     */
    public static LocalDateTime getStartTimeOfMonth(String month) {
        return getFirstDayOfMonth(month).with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();
    }

    /**
     * 根据LocalDate获取当月最后一日23时59分59秒的LocalDateTime
     * @param localDate 日期
     * @return 该日期所在月的最后一日23时59分59秒的LocalDateTime
     */
    public static LocalDateTime getEndTimeOfMonth(LocalDate localDate){
        return localDate.with(TemporalAdjusters.lastDayOfMonth()).atTime(23,59,59);
    }

    /**
     * 根据LocalDateTime获取当月最后一日23时59分59秒的LocalDateTime
     * @param localDateTime 日期时间
     * @return 该日期时间所在月的最后一日23时59分59秒的LocalDateTime
     */
    public static LocalDateTime getEndTimeOfMonth(LocalDateTime localDateTime){
        return localDateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth()).atTime(23,59,59);
    }

    /**
     * 根据月份String("yyyy-MM")获取当月最后一日23时59分59秒的LocalDateTime
     * @param month 月份("yyyy-MM")
     * @return 该月最后一日23时59分59秒的LocalDateTime
     */
    public static LocalDateTime getEndTimeOfMonth(String month) {
        return getFirstDayOfMonth(month).with(TemporalAdjusters.lastDayOfMonth()).atTime(23,59,59);
    }

    /**
     * 根据LocalDate判断当日是否为周末
     * @param localDate 日期
     * @return 是或否
     */
    public static boolean atWeekends (LocalDate localDate){
        return localDate.getDayOfWeek().getValue() == DayOfWeek.SATURDAY.getValue() || localDate.getDayOfWeek().getValue() == DayOfWeek.SUNDAY.getValue();
    }

    /**
     * 根据LocalDateTime判断当日是否为周末
     * @param localDateTime 日期时间
     * @return 是或否
     */
    public static boolean atWeekends (LocalDateTime localDateTime){
        return localDateTime.getDayOfWeek().getValue() == DayOfWeek.SATURDAY.getValue() || localDateTime.getDayOfWeek().getValue() == DayOfWeek.SUNDAY.getValue();
    }

    /**
     * LocalDateTime 转为 时间戳——毫秒时间
     *
     * @param localDateTime 日期时间
     * @return 时间戳——毫秒时间
     */
    public static Long localDateTimeToTimestamp(LocalDateTime localDateTime) {
        if (localDateTime == null) {
            return null;
        }
        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 时间戳——毫秒时间 转为 LocalDateTime
     *
     * @param timestamp 时间戳——毫秒时间
     * @return LocalDateTime
     */
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
    }
}

